package tech.aistar.corejava.day07;

/**
 * - JVM通过类加载器加载类进内存.
 - 立即给静态属性分配空间以及初始化
 - 立即给静态方法分配空间以及初始化
 - 会给静态代码块分配空间以及初始化
 - 调用静态代码块
 - 如果创建了对象
 - 会给所有的非静态属性分配空间以及初始化
 - 会给所有的非静态方法分配空间以及初始化
 - 调用普通代码块
 - 调用构造块
 */
public class CodeDemo {
    //非静态属性
    private int id = 10;

    //静态属性
    private static int sid = 100;

    //构造块 - 只要new对象的时候
    public CodeDemo(){
        System.out.println("构造块!");
        System.out.println("构造块_id:"+id);//ok
        System.out.println("构造块_sid:"+sid);//ok
    }

    //普通代码块 - 每次创建对象的时候会优先调用普通代码块
    //普通代码块的执行时机高于构造块
    //但是实际开发中,我们不使用普通代码块,一般会将普通代码块中的
    //代码移植到构造块中
    {
        System.out.println("普通代码块!");
        System.out.println("普通代码块_id:"+id);//ok
        System.out.println("普通代码块_sid:"+sid);//ok
    }

    //静态代码块 - JVM加载类进内存的时候 - 会优先给静态代码块分配空间
    //和初始化 - 并且初始化的时机仅仅只有一次
    static{
        //一般可以进行加载一些比较费时费力的加载资源的配置文件的活...
        System.out.println("静态代码块!");
        System.out.println("静态代码块_sid:"+sid);//ok
        //不能直接使用非静态属性.
    }

    public static void main(String[] args){
        CodeDemo c1 = new CodeDemo();
        CodeDemo c2 = new CodeDemo();
    }
}
